<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>线性结构-队列应用-击鼓传花</title>
</head>

<body>
  <script>
    // 封装队列类
    function Queue() {
      // 属性
      this.items = []
      // 方法
      // 1.将元素加入到队列
      Queue.prototype.enqueue = function (element) {
        this.items.push(element)
      }
      // 2.从队列中删除前端元素
      Queue.prototype.dequeue = function () {
        return this.items.shift()
      }
      // 3.查看前端的元素
      Queue.prototype.front = function () {
        return this.items[0]
      }
      // 4.查看队列是否为空
      Queue.prototype.isEmpty = function () {
        return this.items.length == 0
      }
      // 5.查看队列中元素的个数
      Queue.prototype.size = function () {
        return this.items.length
      }
      // 6.toString方法
      Queue.prototype.toString = function () {
        let string = ''
        for (let i = 0; i < this.items.length; i++) {
          string += this.items[i] + '--'
        }
        return string
      }
    }

    // 击鼓传花函数
    function passGame(nameList, num) {
      // 1.创建一个队列
      const queue = new Queue()
      // 2.将所有人加入队列
      for (let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
      }
      // 3.开始数数字
      while (queue.size() > 1) {
        // 不是num时候,重新加入到队列末尾
        // 是num这个数字时候,将其从队列删除
        // 3.1num数字之前的人重新放入到队列末尾
        for (let i = 0; i < num - 1; i++) {
          queue.enqueue(queue.dequeue())
        }
        // 3.2num对应这个人,直接从队列删除
        queue.dequeue()
      }

      // 4.获取剩下那个人
      alert(queue.size())
      let endName = queue.front()
      alert('最终剩下的人' + endName)
      return nameList.indexOf(endName)
    }

    // 测试击鼓传花
    names = ['lily', 'lucy', 'tom', 'lilei', 'why']
    alert(passGame(names, 3))

  </script>
</body>

</html>